package com.edusys.dao.impl;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.edusys.dao.SuperDao;

public class CommonDao<T> extends BaseDao<T> implements SuperDao<T> {

	@Override
	public List<T> query(T t) {
		List<T> ts=new ArrayList<T>();
		String tableName=t.getClass().getSimpleName();
		String sql="select * from "+tableName;
		try {
			super.rs=super.getData(sql);
			//获取完整类名
			String fullName=t.getClass().getName();
			//利用反射获取类名，并利用类名实例化对象
			Class<?> clazz=Class.forName(fullName);
			//获取该对象的所有属性（字段）
			Field[] fields=clazz.getDeclaredFields();
			//获取返回的行数
			//int rowCount=getTotal(t);
			//循环行
			while(rs.next()) {
				T t2=(T) clazz.newInstance(); //实例化对象并强转成当前对象类型
				//循环列(也就是循环当前对象的所有属性)	
				//System.out.println("属性个数==>"+fields.length);
				for (int i = 0; i < fields.length; i++) {
					//获取当前属性名
					String fieldName=fields[i].getName();
					//System.out.println("当前属性名:"+fieldName);
					//用当前属性名和当前对象，获取当前属性描述器
					PropertyDescriptor pd=new PropertyDescriptor(fieldName, clazz);
					//用当前属性描述器，获取当前属性set方法
					Method method=pd.getWriteMethod();
					
					//获取当前属性的数据类型
					String typeName=fields[i].getGenericType().getTypeName();
					//System.out.println("当前属性的数据类型："+typeName);
					
					//根据类型不同，rs调用不同的get方法
					if (typeName.equals("java.lang.String")) {
						fields[i].setAccessible(true);
						method.invoke(t2, rs.getString(fieldName));
					}else if (typeName.equals("int")) {
						fields[i].setAccessible(true);
						method.invoke(t2, rs.getInt(fieldName));
					}else if (typeName.equals("double")) {
						fields[i].setAccessible(true);
						method.invoke(t2, rs.getDouble(fieldName));
					}else {}
				}
				ts.add(t2);
			}
			
			
			
			
//					switch (typeName) {
//					case "java.lang.String":
//						method.invoke(t2, rs.getString(fieldName));
//						break;
//					case "int":
//						method.invoke(t2, rs.getInt(fieldName));
//						break;
//					case "double":
//						method.invoke(t2, rs.getDouble(fieldName));
//						break;
//					}
		} catch (SQLException | InstantiationException | IllegalAccessException | ClassNotFoundException | IntrospectionException | IllegalArgumentException | InvocationTargetException e) {
			e.printStackTrace();
		}finally {
			super.close_db();
		}
		return ts;
	}

	@Override
	public boolean update(T t) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public int getTotal(T t) {
		String tableName=t.getClass().getSimpleName();
		String sql="select count(*) totalCount from "+tableName;
		int tCount=0;
		try {
			super.rs=super.getData(sql);
			while(rs.next()) {
				tCount=rs.getInt("totalCount");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			super.close_db();
		}
		return tCount;
	}

}
